package com.chensi.dao;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Criterion;

/**
 * 公共数据库接口
 * @author chensi
 * @version 2016-5-3 上午11:16:02
 */
public interface ICommonDao {
    /**
     * 获取当前Session
     */
    Session getSession();

    /**
     * 根据Id获取实体对象
     *
     * @param entityClass 实体类型
     * @param id          实体对象主键
     * @return 查询结果对象
     */
    <T> T get(Class<T> entityClass, Serializable id);

    /**
     * 获取实体类的所有数据集合
     *
     * @param entityClass 实体类型
     * @return 所有数据集合
     */
    <T> List<T> getAll(Class<T> entityClass);

    /**
     * 按属性查找对象列表.
     */
    <T> List<T> findByProperty(Class<T> entityClass, String propertyName, Object value);

    <T> List<T> find(String hql);
    
    /**
     * 通过HQL和参数查询列表
     *
     * @param hql 查询hql
     * @return params 参数
     */
    <T> List<T> findByHql(String hql, Object... params);

    /**
     * 通过HQL和参数查询列表
     *
     * @param sql 查询sql
     * @return params 参数
     */
    <T> List<T> findBySql(String sql);

    /**
     * 通过HQL和参数查询列表
     *
     * @param sql 查询sql
     * @return params 参数
     */
    <T> List<T> findBySql(String sql, Object[] params);

    /**
     * 通过SQL和参数查询列表
     *
     * @param sql         查询sql
     * @param entityClass 查询结果实体类型
     * @return 查询结果列表
     */
    <T> List<T> findBySql(Class<T> entityClass, String sql);

    /**
     * 通过SQL和参数查询列表
     *
     * @param entityClass 查询结果实体类型
     * @param sql         查询sql
     * @param params      参数
     * @return 查询结果列表
     */
    <T> List findBySql(Class<T> entityClass, String sql, Object[] params);

    /**
     * 保存实体对象
     *
     * @param entity 实体对象
     */
    <T> void save(T entity);

    /**
     * 保存实体对象集合
     *
     * @param entitys 实体对象集合
     */
    <T> void saveAll(Collection<T> entitys);

    /**
     * 保存或更新实体对象
     *
     * @param entity 实体对象
     */
    <T> void saveOrUpdate(T entity);

    /**
     * 更新指定的实体
     */
    <T> void update(T entity);

    /**
     * 更新实体对象集合
     *
     * @param entitys 实体对象集合
     */
    <T> void updateAll(Collection<T> entitys);

    /**
     * 删除实体对象对应的数据库记录
     *
     * @param entity 实体对象
     */
    <T> void delete(T entity);

    /**
     * 根据主键删除实体对象
     *
     * @param entityClass 实体对象类型
     * @param id          主键
     */
    <T> void deleteById(Class<T> entityClass, Serializable id);

    /**
     * 删除实体对象集合
     *
     * @param entitys 实体对象集合
     */
    <T> void deleteAll(Collection<T> entitys);

    /**
     * 根据实体类创建查询实体
     *
     * @param entityClass 实体类型
     * @return 查询实体
     */
    <T> Criteria createCriteria(Class<T> entityClass);

    /**
     * 创建带查询实体集合的查询实体对象
     *
     * @param entityClass 实体类型
     * @param criterions  查询参数集合
     * @return 查询实体
     */
    <T> Criteria createCriteria(Class<T> entityClass, Criterion... criterions);
}